interface ChunkFileUrlType {
  url: string;
  file: Blob;
}
type UploadProgressCallback = (process: number, status: UploadStatus, md5?: string, md5Progress?: number) => void;
/**
 * 文件上传状态
 * 计算MD5中（加载中） | 等待上传 | 上传中  | 上传成功 | 上传失败
 */
type UploadStatus = 'loaded' | 'preparation' | 'preupload' | 'uploading' | 'success' | 'error';

/** 表格数据类型 */
interface FileTableDataType {
  uid: string;
  name: string;
  size: number;
  unitSize: string;
  md5: string;
  md5Progress: number;
  progress: number;
  file: File;
  chunkCount: number;
  /** 当前文件分片集合 */
  chunkFileList: Blob[];
  /** 已上传的文件大小总和（计算进度条） */
  uploadedSize: number;
  /** 计算MD5中（加载中） | 等待上传 | 上传中  | 上传成功 | 上传失败 */
  status: UploadStatus;
  statusTag: any;
}

interface UploadFileInfo {
  fileKey: string;
  fileMd5: string;
  fileMimeType: string;
  fileName: string;
  fileSize: number;
  fileSuffix: string;
  id: string;
  isDone: boolean;
  partCount: number;
  partList: FilePart[];
  partSize: number;
}

interface FilePart {
  endPosition: number;
  startPosition: number;
  uploadId: string;
  url: string;
}

//  文件上传过程中的多种状态
export const tagMap = {
  loaded: { color: 'gray', text: '已加载' },
  preparation: { color: 'gold', text: 'MD5计算中' },
  preupload: { color: 'purple', text: '等待上传' },
  uploading: { color: 'blue', text: '上传中' },
  success: { color: 'green', text: '上传成功' },
  error: { color: 'error', text: '上传失败' }
};

/**
 * 转换文件的大小带单位
 * @param size 文件大小
 * @returns string
 */
export function convertFileSizeUnit(size = 0): string {
  if (size === 0) return '0 B';

  if (size < 1024) {
    return `${size} B`; // 小于1KB
  } else if (size < 1024 * 1024) {
    return `${(size / 1024).toFixed(2)} KB`; // 小于1MB
  } else if (size < 1024 * 1024 * 1024) {
    return `${(size / (1024 * 1024)).toFixed(2)} MB`; // 小于1GB
  } else {
    return `${(size / (1024 * 1024 * 1024)).toFixed(2)} GB`; // 大于等于1GB
  }
}

/**
 * 根据文件流转成的 blob 下载文件
 * @param blob 文件 blob
 * @param filename 文件名
 */
export function downloadFileByBlob(blob: Blob, filename: string) {
  const href = URL.createObjectURL(blob);
  const a = document.createElement('a');
  a.style.display = 'none';
  a.href = href;
  a.download = filename;
  a.rel = 'noopener noreferrer';
  document.body.append(a);
  a.click();
  URL.revokeObjectURL(href); // 释放URL对象
  a.remove();
}

export type { FileTableDataType, UploadFileInfo, UploadStatus, UploadProgressCallback, FilePart, ChunkFileUrlType };
